package persistencia;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import dao.Hotel;
import dao.Lugar;
import dao.SeccionTransporte;
import dao.Terrestre;
import dao.Transporte;
import dao.Vuelo;

public class XMLPersistor extends Persistor {
	
	//antes
	//public class XMLPersistor implements Persistor {
	//private static Persistor instancia = null;

	private XMLPersistor() {
	}

	public static Persistor obtenerInstancia() {
		if (instancia == null) {
			instancia = new XMLPersistor();
		}
		return instancia;
	}

	public static void main(String[] args) {
		try {

			File fXmlFile = new File("C:\\catalogos.xml");
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(fXmlFile);

			// optional, but recommended
			// read this -
			// http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
			doc.getDocumentElement().normalize();

			System.out.println("Root element :"+ doc.getDocumentElement().getNodeName());

			NodeList nList = doc.getElementsByTagName("lugar");
			System.out.println("----------------------------");

			/*for (int temp = 0; temp < nList.getLength(); temp++) {
				Node nNode = nList.item(temp);
				System.out.println("\nCurrent Element :" + nNode.getNodeName());

				if (nNode.getNodeType() == Node.ELEMENT_NODE) {
					Element eElement = (Element) nNode;
					// System.out.println("Staff id : " +
					// eElement.getAttribute("id"));
					System.out.println("nombre : "+ eElement.getElementsByTagName("nombre").item(0).getTextContent());
					System.out.println("descripcion : "+ eElement.getElementsByTagName("descripcion").item(0).getTextContent());
				}
			}*/

			System.out.println("----------------------------");
			NodeList nList1 = doc.getElementsByTagName("hotel");
			for (int temp = 0; temp < nList1.getLength(); temp++) {
				Node nNode1 = nList1.item(temp);
				System.out.println("\nCurrent Element :" + nNode1.getNodeName());
				if (nNode1.getNodeType() == Node.ELEMENT_NODE) {
					Element eElement = (Element) nNode1;
					System.out.println("nombre : "+ eElement.getElementsByTagName("nombre").item(0).getTextContent());
					System.out.println("categoria : "+ eElement.getElementsByTagName("categoria").item(0).getTextContent());
					

					/*NodeList nListHab = doc.getElementById("hab_"+temp);
					for (int j = 0; j < nListHab.getLength(); j++) {
						Node nNodeHab = nListHab.item(j);
						System.out.println("\nCurrent Element :" + nNodeHab.getNodeName());
						if (nNode1.getNodeType() == Node.ELEMENT_NODE) {
					     NodeList nListHabHab = doc.getElementsByTagName("habitacion");
						 for (int x = 0; x < nListHabHab.getLength(); x++) {
							 Node nNodeHabHab = nListHabHab.item(temp);
							 System.out.println("\nCurrent Element :" + nNodeHabHab.getNodeName());
						
						 }
						}
					}*/

				}
			}

			/*System.out.println("----------------------------");
			NodeList nList2 = doc.getElementsByTagName("vuelo");
			for (int temp = 0; temp < nList2.getLength(); temp++) {
				Node nNode = nList2.item(temp);
				System.out.println("\nCurrent Element :" + nNode.getNodeName());
				if (nNode.getNodeType() == Node.ELEMENT_NODE) {
					Element eElement = (Element) nNode;
					System.out.println("numero : "
							+ eElement.getElementsByTagName("numero").item(0)
									.getTextContent());
					System.out.println("aerolinea : "
							+ eElement.getElementsByTagName("aerolinea")
									.item(0).getTextContent());
					System.out.println("horario : "
							+ eElement.getElementsByTagName("horario").item(0)
									.getTextContent());
					System.out.println("fecha : "
							+ eElement.getElementsByTagName("fecha").item(0)
									.getTextContent());
					System.out.println("asiento : "
							+ eElement.getElementsByTagName("asiento").item(0)
									.getTextContent());
				}
			}*/

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public List<Lugar> obtenerLugares() {
		List<Lugar> resultado = new ArrayList<Lugar>();

		Hotel hot = new Hotel("Hotel Prueba", "5 estrellas");
		List<Hotel> listHot = new ArrayList<Hotel>();
		listHot.add(hot);
		//Vuelo vue = new Vuelo(2046, "Volaris", "22:00");
		List<Vuelo> listVue = new ArrayList<Vuelo>();
		//listVue.add(vue);
		
		try {
			File fXmlFile = new File("C:\\Users\\Java\\Documents\\ejercicios\\catalogo.xml");
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(fXmlFile);
			
			doc.getDocumentElement().normalize();			

			NodeList nList = doc.getElementsByTagName("lugar");	
			for (int temp = 0; temp < nList.getLength(); temp++) {
				Node nNode = nList.item(temp);				

				if (nNode.getNodeType() == Node.ELEMENT_NODE) {
					Element eElement = (Element) nNode;				
					Lugar lug = new Lugar(eElement.getElementsByTagName("nombre").item(0).getTextContent(), eElement.getElementsByTagName("descripcion").item(0).getTextContent(), listHot, listVue); 
					
					resultado.add(lug);
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		return resultado;
	}

	@Override
	public List<Hotel> obtenerHoteles() {	
		return null;
	}

	@Override
	public List<Transporte> obtenerTransportes() {	
		List<Transporte> resultado = new ArrayList<Transporte>();
		
		try{
		File fXmlFile = new File("catalogos.xml");
		DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
		Document doc = dBuilder.parse(fXmlFile);
		
		doc.getDocumentElement().normalize();

		//System.out.println("Root element :"+ doc.getDocumentElement().getNodeName());

		NodeList nList = doc.getElementsByTagName("transporte");
		//System.out.println(nList.getLength());
		//System.out.println("----------------------------");

		for (int temp = 0; temp < nList.getLength(); temp++) {
			Node nNode = nList.item(temp);
			//System.out.println("\nCurrent Element :" + nNode.getNodeName());

			if (nNode.getNodeType() == Node.ELEMENT_NODE) {
				Element eElement = (Element) nNode;
				
				
				Lugar lugOrig = new Lugar(eElement.getElementsByTagName("origen").item(0).getTextContent(), "descripcion");
				Lugar lugDest = new Lugar(eElement.getElementsByTagName("destino").item(0).getTextContent(), "descripcion");
				String dateString = eElement.getElementsByTagName("fecha").item(0).getTextContent();
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
				Date fecha = sdf.parse(dateString);				
				
				
				List<SeccionTransporte> secciones = new ArrayList<SeccionTransporte>();
				NodeList nListSecciones = doc.getElementsByTagName("seccion");
				for (int j = 0; j < nListSecciones.getLength(); j++) {
					Node nNodeSecc = nListSecciones.item(j);
					
					SeccionTransporte objSeccTrans = new SeccionTransporte();
					objSeccTrans.setClase(((Element)nNodeSecc).getElementsByTagName("clase").item(0).getTextContent());
					objSeccTrans.setCosto(Float.valueOf(((Element)nNodeSecc).getElementsByTagName("costo").item(0).getTextContent()));
					objSeccTrans.setDescripcion(((Element)nNodeSecc).getElementsByTagName("descripcion").item(0).getTextContent());
					secciones.add(objSeccTrans);
				}
				
				
				
				String tipo = eElement.getElementsByTagName("tipo").item(0).getTextContent().toString();				
				if(tipo.equals("Avion")){					
					Vuelo objTransVuelo = new Vuelo();					
					objTransVuelo.setProveedor(eElement.getElementsByTagName("proveedor").item(0).getTextContent());
					objTransVuelo.setTipoTransporte(tipo);
					objTransVuelo.setHorario(eElement.getElementsByTagName("horario").item(0).getTextContent());
					objTransVuelo.setFecha(fecha);
					objTransVuelo.setOrigen(lugOrig);
					objTransVuelo.setDestino(lugDest);					
					objTransVuelo.setIdentificador(eElement.getElementsByTagName("identificador").item(0).getTextContent());
					objTransVuelo.setSecciones(secciones);
					
					
					resultado.add(objTransVuelo);					
				}else if(tipo.equals("Camion")){
					Transporte objTransTerr = new Terrestre();					
					objTransTerr.setProveedor(eElement.getElementsByTagName("proveedor").item(0).getTextContent());
					objTransTerr.setTipoTransporte(tipo);
					objTransTerr.setHorario(eElement.getElementsByTagName("horario").item(0).getTextContent());
					objTransTerr.setFecha(fecha);
					objTransTerr.setOrigen(lugOrig);
					objTransTerr.setDestino(lugDest);
					objTransTerr.setIdentificador(eElement.getElementsByTagName("identificador").item(0).getTextContent());
					resultado.add(objTransTerr);	
				}
			}
		}
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return resultado;
	}

}
